#ifndef PLIC_H
#define PLIC_H

#include <stdint.h>
#include "interrupt.h"  // 依赖irq_priority_t类型

// PLIC（Platform-Level Interrupt Controller）物理地址映射（QEMU virt平台）
#define PLIC_BASE_ADDR 0xC000000UL  // PLIC起始地址
#define PLIC_PRIORITY_OFFSET 0x0     // 中断优先级寄存器偏移（每个IRQ占4字节）
#define PLIC_PENDING_OFFSET 0x1000   // 中断pending寄存器偏移（64位）
#define PLIC_ENABLE_OFFSET 0x2000    // 中断使能寄存器偏移（按HART分组，每组8字节）
#define PLIC_THRESHOLD_OFFSET 0x200000  // 优先级阈值寄存器偏移（按HART分组）
#define PLIC_CLAIM_OFFSET 0x200004      // 中断认领/完成寄存器偏移（按HART分组）

// 计算PLIC寄存器地址的宏（针对单HART系统，多HART需扩展）
#define PLIC_PRIORITY(irq)  (PLIC_BASE_ADDR + PLIC_PRIORITY_OFFSET + 4 * (irq))
#define PLIC_PENDING        (PLIC_BASE_ADDR + PLIC_PENDING_OFFSET)
#define PLIC_ENABLE(hart)   (PLIC_BASE_ADDR + PLIC_ENABLE_OFFSET + 8 * (hart))
#define PLIC_THRESHOLD(hart) (PLIC_BASE_ADDR + PLIC_THRESHOLD_OFFSET + 0x1000 * (hart))
#define PLIC_CLAIM(hart)    (PLIC_BASE_ADDR + PLIC_CLAIM_OFFSET + 0x1000 * (hart))

// PLIC初始化：设置默认优先级和禁用所有中断
void plic_init(void);

// 设置指定IRQ的优先级（0-7，0为最低）
void plic_set_priority(uint32_t irq, irq_priority_t prio);

// 使能指定IRQ向目标HART发送中断
void plic_enable(uint32_t irq, uint32_t hart);

// 禁用指定IRQ向目标HART发送中断
void plic_disable(uint32_t irq, uint32_t hart);

// 设置HART的中断优先级阈值（仅处理优先级高于阈值的中断）
void plic_set_threshold(uint32_t hart, uint32_t threshold);

// 认领当前最高优先级的中断（返回IRQ号，处理完成后需调用plic_complete）
uint32_t plic_claim(uint32_t hart);

// 通知PLIC中断处理完成（参数为plic_claim返回的IRQ号）
void plic_complete(uint32_t hart, uint32_t irq);
#endif  // 新增这一行
